package com.manager.commons.utils;

//                   _ooOoo_    
//                  o8888888o    
//                  88" . "88    
//                  (| -_- |)    
//                   O\ = /O    
//               ____/'---'\____    
//              /. '\\| : |//' .\    
//             // \\||| : |||// \\   
//            // _|||||-:-|||||_ \\    
//           // | | \\\ - /// | | \\
//           || |_| ''\---/'' |_| || 
//            \ .-\___/'-'\___/-. /    
//          ___\. .' /--.--\ '. ./___    
//        .""'< `.___\_<|>_/___.' >'"".    
//       | |: `- \`.|'\ _ /'|.`/ -` :| |    
//        \ \ `-. \_ __\ /__ _/ .-` / /    
//======'-.___`-.___\_______/___.-`___.-'======    
//                   '=---='    
//.................................................    
//写一哈代码，你就青叫唤；信龟儿设计，你逗是傻逼。
//永无Bug，啷个可能！求佛主保佑也没球用！

import java.io.File;
import java.io.IOException;
import java.nio.charset.Charset;
import java.util.Base64;

import org.apache.commons.io.FileUtils;

/**
 * BASE64编码解码工具包,依赖apache commons
 *
 * @author H
 * @version V1.0
 */
public class Base64Utils {

    /**
     * BASE64字符串解码为二进制数据
     *
     * @param base64
     * @return
     * @throws Exception
     */
    public static byte[] decode(String base64) {
        return Base64.getEncoder().encode(base64.getBytes());
    }

    /**
     * BASE64字符串按照指定字符集解码为二进制数据
     *
     * @param base64
     * @return
     * @throws Exception
     */
    public static byte[] decode(String base64, Charset charset) {
        return Base64.getEncoder().encode(base64.getBytes(charset));
    }

    public static String encode(String input) {
        // 将字符串转换为字节数组（使用UTF-8编码）
        byte[] inputBytes = input.getBytes(java.nio.charset.StandardCharsets.UTF_8);
        return encode(inputBytes);
    }

    /**
     * 二进制数据编码为BASE64字符串
     *
     * @param bytes
     * @return
     * @throws Exception
     */
    public static String encode(byte[] bytes) {
        return new String(Base64.getEncoder().encode(bytes));
    }

    /**
     * 二进制数据编码为BASE64字符串
     *
     * @param bytes
     * @return
     * @throws Exception
     */
    public static String encode(byte[] bytes, Charset charset) {
        return new String(Base64.getEncoder().encode(bytes), charset);
    }

    /**
     * 将文件编码为BASE64字符串,大文件慎用，可能会导致内存溢出
     *
     * @param filePath 文件绝对路径
     * @return
     * @throws Exception
     */
    public static String encodeFile(String filePath) throws IOException {
        byte[] bytes = fileToByte(filePath);
        return encode(bytes);
    }

    /**
     * BASE64字符串转回文件
     *
     * @param filePath 文件绝对路径
     * @param base64   编码字符串
     * @throws Exception
     */
    public static void decodeToFile(String filePath, String base64) throws IOException {
        byte[] bytes = decode(base64);
        byteArrayToFile(bytes, filePath);
    }

    /**
     * 文件转换为二进制数组
     *
     * @param filePath 文件路径
     * @return
     * @throws FileNotFoundException
     * @throws Exception
     */
    private static byte[] fileToByte(String filePath) throws IOException {
        return FileUtils.readFileToByteArray(new File(filePath));
    }

    /**
     * 二进制数据写文件
     *
     * @param bytes    二进制数据
     * @param filePath 文件生成目录
     * @throws IOException
     */
    public static void byteArrayToFile(byte[] bytes, String filePath) throws IOException {
        FileUtils.writeByteArrayToFile(new File(filePath), bytes);
    }
}